package simpledb.common;

/**
 * Debug 是一个实用工具类，它封装了 println 语句，并允许更少或更多的命令行输出被开启。
 * <p>
 * 使用系统属性更改 DEBUG_LEVEL 常量的值：simpledb.simpledb.common.Debug。例如，在命令行上使用 -Dsimpledb.Debug=x，
 * 或者简单地使用 -Dsimpledb.Debug 来启用级别为 0 的调试。如果 level 数字小于或等于当前设置的 DEBUG_LEVEL，
 * log(level, message, ...) 方法将打印到标准输出。
 */
public class Debug {

    // 静态初始化块用于设置调试等级
    private static final int DEBUG_LEVEL;

    static {
        String debug = System.getProperty("simpledb.simpledb.common.Debug");
        if (debug == null) {
            // 如果没有设置系统属性，则禁用调试（DEBUG_LEVEL = -1）
            DEBUG_LEVEL = -1;
        } else if (debug.length() == 0) {
            // 如果设置了但为空，则默认启用级别 0
            DEBUG_LEVEL = 0;
        } else {
            // 否则，使用提供的值作为调试级别
            DEBUG_LEVEL = Integer.parseInt(debug);
        }
    }

    // 默认的调试级别
    private static final int DEFAULT_LEVEL = 0;

    /**
     * 如果日志级别 >= level，则记录消息。使用 printf 格式化输出。
     * @param level 日志级别
     * @param message 要打印的消息
     * @param args 消息中要替换的参数
     */
    public static void log(int level, String message, Object... args) {
        if (isEnabled(level)) {
            System.out.printf(message, args);
            System.out.println();
        }
    }

    /**
     * 判断给定的日志级别是否启用。
     * @param level 要检查的日志级别
     * @return 如果该级别已启用，则返回 true
     */
    public static boolean isEnabled(int level) {
        return level <= DEBUG_LEVEL;
    }

    /**
     * 判断默认级别的日志是否启用。
     * @return 如果默认级别已启用，则返回 true
     */
    public static boolean isEnabled() {
        return isEnabled(DEFAULT_LEVEL);
    }

    /**
     * 在默认日志级别记录一条消息。
     * @param message 要打印的消息
     * @param args 消息中要替换的参数
     */
    public static void log(String message, Object... args) {
        log(DEFAULT_LEVEL, message, args);
    }
}
